# -*- coding: utf-8 -*-

import sys
import urllib
import urllib2

def get_user_token(username, password):
    """获取token。
    
    根据用户和密码，到keystone处获取token。

    参数：
        username: 用户名。 
        password: 密码。

    返回值：
        返回获取的token，字符串格式。
    """
    url = 'http://controller:35357/v3/auth/tokens'
    body = ('{"auth": {"scope": {"project": {"domain": {"name": "Default"}, "name": "%s"}},'
        '"identity": {"password": {"user": {"domain": {"name": "Default"}, "password": "%s", "name": "%s"}},'
        '"methods": ["password"]}}}'%(username, password, username))
    headers = {'Content-Type': 'application/json'}
    req = urllib2.Request(url, body, headers)
    response = urllib2.urlopen(req)
    return response.info()['X-Subject-Token']

def get_compute_service_list():
    """获取系统运行的compute服务信息。

    获取系统运行的compute服务信息，信息包括compute服务所在的计算节点的名称及服务的状态。

    参数：
        无。

    返回值：
        compute服务列表,列表中元素为字典,字典存储compute服务所在计算节点的名称及服务的状态。
        例如:

        [{'status': 'enabled', 'host': 'compute2'},
        {'status': 'disabled', 'host': 'compute3'}]        
    """
    token = get_user_token('admin', 'bjtungirc')
    url = 'http://controller:8774/v2.1/os-services'
    headers = {"OpenStack-API-Version": "compute 2.53", "User-Agent": "python-novaclient"}
    headers.update({"Accept": "application/json", "X-OpenStack-Nova-API-Version": 2.53})
    headers.update({"X-Auth-Token": token})
    req = urllib2.Request(url=url, headers=headers)
    response = urllib2.urlopen(req)
    #eval()函数将字符串装换成字典，但是对null和false无法处理，所以提前赋值(下同)
    null = "null"
    false = "false"
    response = eval(response.read())
    services = response["services"]
    compute_service_list = []
    for service in services:
        if service["binary"] == "nova-compute":
            compute_service_list.append({"host": service["host"], "status": service["status"], "state": service["state"]})
    return compute_service_list
def main():
    result = get_compute_service_list()
    print result
    return
if __name__ == "__main__":
    main()


